//
// Created by 34649 on 2022/3/1.
//
#ifndef AYIN_MUDUO_HTTP_DECODER_H
#define AYIN_MUDUO_HTTP_DECODER_H
#include "http_type.h"
#include "algorithm"
namespace http{
    class http_decoder{
    private:

        Buffer *_buffer;                            //缓存区
        string src;                                 //待解析的 http 报文
        int _pos;                                   //当前解析位置
        string _url;                                //请求的 url 
        HTTP_VERSION _httpVersion;                  //http 协议版本
        METHOD _method;                             //http 请求方法
        hmap _map;                                  //请求头映射
        CONTENT_TYPE _content_type;
        int _content_length;
        string _boundary;
        string _content;                             //请求体
        string getLine();                           //获取一行（以CRLF结尾）
        string getLine(bool &flag);                  //获取一行(以CRLF结尾)且增加状态，判断是否是空行;
        string split_line(string& str);             //默认用空格分割，分割之后会自动减去剩余字符串多余的空格
        string split_line(string& str,char de);     //自定义分割字符符
        inline void toLowerStr(string& str){        //将字符串转换为小写
            std::transform(str.begin(),str.end(), str.begin(),tolower);
        }

    public:
        HTTP_PARSE_STATUS status;                   //解析状态
        bool keep_alived;                           //是否保持连接
        inline METHOD getMethod(){return this->_method;}
        inline string getUrl(){return this->_url;}
        void init();                               //初始化decoder
        explicit http_decoder(const string &src);
        explicit http_decoder(Buffer *buffer);
        ~http_decoder();
        /**
         * @brief 解析 http 报文
         * 
         * @return HTTP_PARSE_CODE
         */
        HTTP_PARSE_CODE parse_http();

        /**
         * @brief 解析 http 请求行
         * 
         * @return HTTP_PARSE_CODE
         */
        HTTP_PARSE_CODE read_questLine();

        /**
         * @brief 解析 http 请求头
         * 
         * @return HTTP_PARSE_CODE
         */
        HTTP_PARSE_CODE read_header();

        /**
         * @brief 解析 http 请求体
         * 
         * @return HTTP_PARSE_CODE
         */
        HTTP_PARSE_CODE read_content();
        HTTP_PARSE_CODE parse_code;
    };
    using decoderPtr=std::shared_ptr<http_decoder>;
}
#endif //AYIN_MUDUO_HTTP_DECODER_H
